package is202.hrms.ejb;

import is202.hrms.entity.Register;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



/**
 * Denne ejb håndterer database operasjoner for Register objekter.
 * Den har ingen felter(bortsett fra for entity manager som
 * blir behandlet av containeren),det betyr at den ikke kan beholde status, og
 * er markert som Stateless for å markere den som en stateless session bean.
 * En stateless bean kan deles av flere brukere, så den er effektiv
 * med tanke på ressursbruk.
 *
 * @author Anders
 */
@Stateless
public class RegisterEJB extends AbstractFacade<Register> {
    /**
     * @PersistenceContext er en forespørsel til containeren(Catalina)
     * for å lage eller finne en EntityManager og lagre den i feltet em.
     * Vi får EntityManager objektet vi trenger, uten å måtte skrive koden for å lage det.
     * Dette er kalt dependency injection.
     * 
     */
    @PersistenceContext(unitName = "slitdb")
    private EntityManager em;

    /** 
     * Dene metoden blir brukt i metodene fra AbstractFacade
     * for å få tilgang til EntityManager
     */
    @Override 
    protected EntityManager getEntityManager() {
        return em;
    }

    public RegisterEJB() {
        super(Register.class);
    }

    /** 
     * Denne metoden returnerer alle registreringene den finner. Den blir brukt 
     * av registreringssiden for å sjekke at det finnes registrerte brukere, og 
     * returnerer listen med alle verdier og indekser. 
     */
    public Register getDefaultRegister() {
        List<Register> registerList = findAll();
        if (registerList != null && registerList.size() > 0) {
            return registerList.get(0);
        } else {
            throw new IllegalStateException("Ingen tilgjenglige registrerte");
        }
    }

    /** 
     * En wrapper for find() metoden i AbstractFacade. Den lar oss
     * bruke primærnøkkelen som den primitive typen long, heller enn å ha en 
     * wrapper type som Long. 
     */
    public Register find(long registerNr) {
        Register register = super.find(registerNr);
        if (null != register) register.getRegister();
        return register;
    }

    @Override
    public void delete(Register register) {
        register = em.merge(register);
        if (register.getRegister().isEmpty()) super.delete(register);
        else throw new EJBException("Kan ikke slette registrerte");
    }

}
